/*
 * 
 * 
 * 
 */
package com.hboxs.asl.dao;

import com.hboxs.asl.Filter;
import com.hboxs.asl.Order;
import com.hboxs.asl.Page;
import com.hboxs.asl.Pageable;
import com.hboxs.asl.entity.Member;
import com.hboxs.asl.entity.Product;
import com.hboxs.asl.entity.Review;

import java.util.List;

/**
 * Dao - 评论
 */
public interface ReviewDao extends BaseDao<Review, Long> {

    /**
     * 我的服务分
     * @param member
     * @return
     */
    Double serviceScore(Member member);

    /**
     * 我的方案分
     * @param member
     * @return
     */
    Double schemeScore(Member member);

    /**
     * 我的反馈分
     * @param member
     * @return
     */
    Double feedbackScore(Member member);

    /**
     * 我的评论
     * @param pageable
     * @param member
     * @return
     */
    Page<Review> myCommemtPage(Pageable pageable, Member member);

    /**
     * 我的评价
     * @param teacher
     * @return
     */
    List<Review> myCommentList(Member teacher, Integer count, List<Filter> filters, List<Order> orders);

    /**
     * 获取老师的评价
     * @param pageable
     * @param teacher
     * @return
     */
    Page<Review> reviewPage(Pageable pageable, Member teacher);

    /**
     * 获取我的评价总数
     * @param teacher
     * @return
     */
    long myReviews(Member teacher);

    /**
     * 查找评论
     *
     * @param member  会员
     * @param product 商品
     * @param type    类型
     * @param isShow  是否显示
     * @param count   数量
     * @param filters 筛选
     * @param orders  排序
     * @return 评论
     */
    List<Review> findList(Member member, Product product, Review.Type type, Boolean isShow, Integer count, List<Filter> filters, List<Order> orders);

    /**
     * 查找评论分页
     *
     * @param member   会员
     * @param product  商品
     * @param type     类型
     * @param isShow   是否显示
     * @param pageable 分页信息
     * @return 评论分页
     */
    Page<Review> findPage(Member member, Product product, Review.Type type, Boolean isShow, Pageable pageable);

    /**
     * 查找评论分页
     *
     * @param member   会员
     * @param product  商品
     * @param type     类型
     * @param isShow   是否显示
     * @param pageable 分页信息
     * @return 评论分页
     */
    Page<Review> findPageGroup(Member member, Product product, Review.Type type, Boolean isShow, Pageable pageable);

    /**
     * 查找评论数量
     *
     * @param member  会员
     * @param product 商品
     * @param type    类型
     * @param isShow  是否显示
     * @return 评论数量
     */
    Long count(Member member, Product product, Review.Type type, Boolean isShow);

    /**
     * 判断会员是否已评论该商品
     *
     * @param member  会员
     * @param product 商品
     * @return 是否已评论该商品
     */
    boolean isReviewed(Member member, Product product);

    /**
     * 计算商品总评分
     *
     * @param product 商品
     * @return 商品总评分，仅计算显示评论
     */
    long calculateTotalScore(Product product);

    /**
     * 计算商品评分次数
     *
     * @param product 商品
     * @return 商品评分次数，仅计算显示评论
     */
    long calculateScoreCount(Product product);

    /**
     * 获取最新的三个评价
     *
     * @param product
     * @return
     */
    List<Review> lastThreeReviews(Product product);

    long count(Member member, Product product, Boolean isShow);

}